#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

int p;
char data[5000],code[50000];

void
ignore(char **picode)
{
	while (!strchr(":<>=+-.,[]0123456789",**picode)) {
		(*picode)++;
	}
}
uint32_t
dup(char **picode)
{
	uint32_t n=1;
	//ignore(picode);
	if (isdigit(**picode)) {
		n=atoi(*picode);
		while (isdigit(**picode)) {
			(*picode)++;
		}
	}
	return n;
}
void
interpret(char *icode)
{
	int b,n,i;
	char *w;

	while (*icode) {
		switch (*icode++) {
			case ':':
				n=dup(&icode);
				p=n;
				break;
			case '<':
				n=dup(&icode);
				p-=n;
				break;
			case '>':
				n=dup(&icode);
				p+=n;
				break;
			case '=':
				n=dup(&icode);
				data[p]=n;
				break;
			case '+':
				n=dup(&icode);
				data[p]+=n;
				break;
			case '-':
				n=dup(&icode);
				data[p]-=n;
				break;
			case '.':
				n=dup(&icode);
				for (i=0; i<n; i++) {
					putchar(data[p]);
					fflush(stdout);
				}
				break;
			case ',':
				n=dup(&icode);
				for (i=0; i<n; i++) {
					data[p]=getchar();
					fflush(stdout);
				}
				break;
			case '[':
				for (b=1,w=icode;b&&*icode;icode++)
					b+=*icode=='[',b-=*icode==']';
				if (!b) {
					while (data[p])
						interpret(w);
					break;
				}
				printf("unbalanced brackets!");
				exit(0);
			case ']':
				return;
			default:
				break;
		}
		if (p<0||p>=5000)
			puts("range error"),exit(0);
	}
}

int
main(int argc, char *argv[])
{
	FILE *fin;
	char *s=code,ch;

	if (fin=fopen(argv[1],"r")) {
		while ((ch=getc(fin))>=0)
			*s++=ch;
		*s=0;
		interpret(code);
	}
	return 0;
}
